<?php

declare(strict_types=1);

namespace app\common\service\sys;

use app\common\dao\sys\MenuDao;
use app\common\traits\ServiceTrait;
use app\common\dao\sys\UserRoleMenusDao;

/**
 * 用户-角色-菜单关联 - 业务
 * @author:kaige
 * @update:2022-06-13
 * @copyright ©2022 泉州市盛筑信息科技有限公司 版权所有
 */
class UserRoleMenusService
{
  protected $dao = null;

  public function __construct()
  {
    $this->dao = new UserRoleMenusDao();
  }
  use ServiceTrait;

  /**
   * 保存权限设置
   * @param int $role_id 角色ID
   * @param $menus 拥有菜单
   * @return bool
   */
  public function savePerm($role_id, $menus)
  {
    $menudao = new MenuDao();
    $this->dao->delUserRoleIdByRoleId($role_id);
    $data = [];
    $menuids = explode(',', $menus);
    $list = $menudao->searchIds($menuids);
    if ($list) {
      foreach ($list as $k => $v) {
        $data[] = [
          'user_role_id' => $role_id,
          'menu_id' => $v['id']
        ];
      }
      if ($this->dao->insertAllData($data)) {
        return true;
      } else {
        return false;
      }
    }
    return false;
  }

  /**
   * 判断管理员是否有当前的操作权限
   */
  public function checkPerm($user_id, $node)
  {
    //如果是超级管理员，直接返回
    if ($user_id == config('kaige.super_id') || $user_id == 168  || $user_id == 438) {
      return _ok();
    }
    return $this->checkOperationPerm($user_id, $node);
  }

  /**
   * 实际校验管理员是否有当前操作（系统级节点）权限
   * @param $user_id
   * @param $node
   */
  private function checkOperationPerm($user_id, $node)
  {
    $result = _err();
    $menuser = new MenuService();
    // 找 控制器 方法 的记录 is_auth 
    $nodewhere = [];
    $nodewhere[] = ['node', '=', $node];
    $nodeinfo =  $menuser->getInfoByWhere($nodewhere);
    if (!$nodeinfo) {
      //未配置节点--默认有权限
      $result['status'] = true;
      return $result;
      // return _err('请联系管理员，配置节点');
    }
    $nodeinfo = $nodeinfo->toArray();
    if ($nodeinfo['is_auth'] != 1) { // is_auth !=1 代表无需权限控制 未配置的也是 !=1
      $result['status'] = true;
      return $result;
    }
    //到这里就说明是普通的管理员，那么就取所有的角色所对应的节点
    $list = $menuser->getRoleMenuData($user_id, 2); // 第二参为2，是判断 is_auth=1
    if (!$list) {
      return _err('没有权限');
    }
    foreach ($list as $val) {
      if ($node == $val['node']) { // 找到该节点
        $result['status'] = true;
        return $result;
      }
    }
    return _err('没有权限');
  }
}
